package com.bee.剑指offer;

import java.util.Stack;

/**
 * 用两个栈来实现一个队列，完成队列的Push和Pop操作。 队列中的元素为int类型。
 * 栈的重点应该在于 栈先进后出的思想，以及对 入栈(push)，出栈(pop) 两种操作的运用。
 * 对象在堆栈中的位置，以 1 为基数。
 *
 * @version 1.0.0
 * @Author yong.Mr
 * @data 2021-03-13
 */
public class 两个栈来实现一个队列 {

    private static Stack<Integer> stack1 = new Stack<Integer>();
    private static Stack<Integer> stack2 = new Stack<Integer>();

    public static void push(int node) {
        if(stack1.empty()){
            stack1.push(node);
        } else {
            while (!stack1.empty()){
                stack2.push(stack1.pop());
            }
            stack2.push(node);
            while (!stack2.empty()) {
                stack1.push(stack2.pop());
            }
        }
    }

    /**
     * 方法二
     */
    public static void push2(int node) {
       if(!stack1.empty() && stack2.empty()) {
           stack1.push(node);
       }
       if(stack1.empty() && stack2.empty()) {
           stack1.push(node);
       }
       if(stack1.empty() && !stack2.empty()){
           while (!stack2.empty()) {
               stack1.push(stack2.pop());
           }
           stack1.push(node);
       } else if(!stack1.empty() && !stack2.empty()) {

           stack1.push(node);
       }
    }

    /**
     * 方法三
     */
    public static void push3(int node) {
        stack1.push(node);
    }

    /**
     * 方法三
     */
    public static int pop3() {
        if(!stack2.empty()) {
            return stack2.pop();
        }
        if(!stack1.empty()) {
            while (!stack1.empty()){
                stack2.push(stack1.pop());
            }
            return stack2.pop();
        }else {
            return Integer.MIN_VALUE;
        }
    }

    /**
     * 方法二
     */
    public static int pop2() {
        if(!stack2.empty()) {
            return stack2.pop();
        }
        if(!stack1.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
            return stack2.pop();
        } else {
            return Integer.MIN_VALUE;
        }
    }

    public static int pop() {
        if(!stack1.empty()) {
            return stack1.pop();
        }
        return Integer.MIN_VALUE;
    }

    /**
     * 方法二
     */
    public int peek2(){
        if(!stack2.empty()) {
            return stack2.peek();
        }
        if(!stack1.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
            return stack2.peek();
        } else {
            return Integer.MIN_VALUE;
        }
    }

    public int peek(){
        if(!stack1.empty()) {
            return stack1.peek();
        }
        return Integer.MIN_VALUE;
    }

    public int size(){
        if(!stack1.empty()) {
            return stack1.size();
        }
        return 0;
    }

    public static int size3(){
        int length = 0;
        if(stack1.empty() && stack2.empty()) {
            return length;
        }else {
            while (!stack2.empty()){
                stack2.pop();
                length++;
            }
            while (!stack1.empty()){
                stack1.pop();
                length++;
            }
        }
        return length;
    }


    public static void main(String[] args) {
        push3(1);
        push3(10);
        push3(3);
        System.out.println(stack1.toString());
        System.out.println(size3());
        System.out.println(pop3());
    }
}
